/** http://hi.baidu.com/billdu/item/11c993f60a21ffcf531c2630
*/

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

struct graphnode { int to, next; } graph[1200010], gsp[1200010];
int grapmr, gspmr, n;
int dfn[500010], low[500010], scc[500010], dfsidx, sccidx;
int stack[500010], top; bool sch[500010], inst[500010];
int v[500010], sccv[500010], deg[500010]; bool bar[500010], sccbar[500010];
void initialize (void)
{
    grapmr = n, gspmr = 0;
    for (int i = 0; i < n; i++) graph[i].next = -1;
    dfsidx = sccidx = top = 0;
    memset(bar, false, sizeof bar);
    memset(sch, false, sizeof sch);
    memset(inst, false, sizeof inst);
}
void link (int a, int b, graphnode *g, int& m)
{
    int p = m++;
    g[p].to = b, g[p].next = g[a].next;
    g[a].next = p;
}
int cmd[500010], ptr[500010], cmdtop;

///this function is used to calculate all the scc(strong connected components)
///and every scc's value.
void tarjan (int x)
{
    int p, tar; cmdtop = 0;
    cmd[cmdtop] = x, ptr[cmdtop++] = -2;
    while (cmdtop)
    {
        int cur = cmd[cmdtop - 1];
        if (ptr[cmdtop - 1] == -2)
        {
            if (sch[cur]) { --cmdtop; continue; }
            dfn[cur] = low[cur] = dfsidx++;
            stack[top++] = cur;
            sch[cur] = inst[cur] = true;
            ptr[cmdtop - 1] = graph[cur].next;
            if (ptr[cmdtop - 1] != -1)
            {
                p = ptr[cmdtop - 1];
                tar = graph[p].to;
                cmd[cmdtop] = tar, ptr[cmdtop++] = -2;
            } continue;
        }
        else if (ptr[cmdtop - 1] == -1)
        {
            if (dfn[cur] == low[cur])
            {
                sccv[sccidx] = 0;
                sccbar[sccidx] = false;
                deg[sccidx] = 0;
                gsp[gspmr++].next = -1;
                do
                {
                    tar = stack[--top];
                    inst[tar] = false;
                    scc[tar] = sccidx;
                    sccv[sccidx] += v[tar];
                    if (bar[tar]) sccbar[sccidx] = true; //indicate if a bar esist here.
                } while (tar != cur);
                ++sccidx;
            } --cmdtop;
        }
        else
        {
            p = ptr[cmdtop - 1];
            tar = graph[p].to;
            if (dfn[tar] > dfn[cur]) low[cur] = min(low[cur], low[tar]);
            else if (inst[tar]) low[cur] = min(low[cur], dfn[tar]);
            ptr[cmdtop - 1] = graph[p].next;
            if (ptr[cmdtop - 1] != -1)
            {
                p = ptr[cmdtop - 1];
                tar = graph[p].to;
                cmd[cmdtop] = tar, ptr[cmdtop++] = -2;
            } continue;
        }
    }
}
pair<int, int> side[500010];
int queue[500010], now, add;
int dyna[500010];
int main ()
{
    int m, a, b, s, p, ans = 0;
    scanf("%d %d", &n, &m);
    initialize();
    for (int i = 0; i < m; i++)
    {
        scanf("%d %d", &a, &b);
        link(a - 1, b - 1, graph, grapmr);
        side[i] = make_pair(a - 1, b - 1);
    }
    for (int i = 0; i < n; i++) scanf("%d", &v[i]);
    scanf("%d %d", &s, &p); --s;
    for (int i = 0; i < p; i++)
    {
        scanf("%d", &a);
        bar[a - 1] = true;
    }
    tarjan(s);
    for (int i = 0; i < m; i++)
    {
        a = side[i].first, b = side[i].second;
        if (sch[a] && sch[b] && (scc[a] != scc[b]))
        {
            link(scc[a], scc[b], gsp, gspmr);
            ++deg[scc[b]];  //topo, compute the incoming degree.
        }
    }
    now = add = 0;
    queue[add++] = scc[s];
    memset(dyna, 0, sizeof dyna);
    //dp by the order of Topo.
    while (now != add)
    {
        int cur = queue[now++];
        dyna[cur] += sccv[cur];
        if (sccbar[cur]) ans = max(ans, dyna[cur]);
        for (int p = gsp[cur].next; p != -1; p = gsp[p].next)
        {
            int tar = gsp[p].to;
            dyna[tar] = max(dyna[tar], dyna[cur]);
            --deg[tar];
            if (deg[tar] == 0) queue[add++] = tar;
        }
    }
    printf("%d\n", ans);
    return 0;
}
